package com.th.common.captcha.service;



import com.th.common.exception.BadRequestException;

import java.util.concurrent.TimeUnit;

/**
 * 验证码业务类
 * 所有的验证码业务类都要继承这个类
 * <p>
 * 业务流程：生成验证码(不包含在本接口中) - 保存验证码(save) - 验证验证码(verify)
 *
 * @author tuhang
 */
public interface BaseCaptchaService {
    /**
     * 存储验证码，按默认过期时间存储
     *
     * @param id 存储验证码的具有唯一标识的id(例如SessionId、邮箱、手机号)
     */
    void save(String id, String captcha);

    /**
     * 存储验证码，按设定的过期时间存储
     *
     * @param id      存储验证码的具有唯一标识的id(例如SessionId、邮箱、手机号)
     * @param captcha 验证码
     * @param timeout 过期时间
     * @param unit    时间单位
     */
    void save(String id, String captcha, long timeout, TimeUnit unit);

    /**
     * 验证
     * 如果验证码错误，抛出客户端异常{@link BadRequestException}
     *
     * @param id      存储验证码的具有唯一标识的id(例如SessionId、邮箱、手机号)
     * @param captcha 需要验证的验证码，即用户输入的验证码
     * @return 是否正确
     */
    boolean verify(String id, String captcha);

    /**
     * 删除存储的验证码
     *
     * @param id 存储验证码的具有唯一标识的id(例如SessionId、邮箱、手机号)
     * @return
     */
    void remove(String id);

    /**
     * 验证后删除验证码
     * 如果验证码错误，抛出客户端异常{@link BadRequestException}，不会删除验证码。
     * 如果验证码正确后，删除验证码
     *
     * @param id
     * @param captcha
     */
    default void verifyAndRemove(String id, String captcha) {
        if (verify(id, captcha)) {
            remove(id);
        }
    }
}
